03-SSL인증서적용
SSL 인증서 적용
개요
Apache HTTP Server에 SSL 인증서를 적용하여 HTTPS 보안 통신을 구현합니다. Let's Encrypt와 AWS Certificate Manager 두 가지 방법을 제공합니다.
방법 선택 가이드
방법 A: Let's Encrypt (현재 단계 권장)
특징:
- 완전 무료
- Apache에 직접 적용 가능
- 자동 갱신 지원 (3개월마다)
- 즉시 적용 가능
적용 시점: 현재 (Week3 완료 후)
방법 B: AWS Certificate Manager (Week3.5 이후)
특징:
- AWS 관리형 서비스
- ALB/CloudFront와 연동 시 무료
- 완전 자동 갱신
- Apache에 직접 적용 불가
적용 시점: Week3.5 ALB 구축 후
상황별 선택 권장
현재 상황: 방법 A (Let's Encrypt) 권장
- 단일 Web 서버에 직접 SSL 적용
- 빠른 HTTPS 구현 가능
- Week3.5에서 ALB 도입 전까지 사용
Week3.5 완료 후: 방법 B로 전환
- ALB에 Certificate Manager 인증서 적용
- Apache에서 SSL 설정 제거 (ALB에서 SSL 종료)
- 더 안정적이고 확장 가능한 구조
방법 A: Let's Encrypt 적용
1단계: Certbot 설치
Apache Web 서버에 SSH 접속:
ssh -i webapp-keypair.pem ec2-user@Web서버-Public-IP
Amazon Linux 2023에 Certbot 설치:
# EPEL 저장소 활성화
sudo dnf install -y epel-release
# Certbot과 Apache 플러그인 설치
sudo dnf install -y certbot python3-certbot-apache
# 설치 확인
certbot --version
2단계: Apache 가상 호스트 준비
SSL 인증서 발급을 위해 도메인 기반 가상 호스트 설정:
# 기존 설정 백업
sudo cp /etc/httpd/conf.d/webapp.conf /etc/httpd/conf.d/webapp.conf.backup
# 가상 호스트 설정 편집
sudo nano /etc/httpd/conf.d/webapp.conf
다음 내용으로 수정:
<VirtualHost *:80>
ServerName yourdomain.com
ServerAlias www.yourdomain.com
DocumentRoot /var/www/html
# JSP 요청을 Tomcat으로 프록시
ProxyPreserveHost On
ProxyPass /webapp/ http://WAS서버-Private-IP:8080/webapp/
ProxyPassReverse /webapp/ http://WAS서버-Private-IP:8080/webapp/
# 정적 파일 디렉토리 설정
<Directory "/var/www/html">
AllowOverride None
Require all granted
</Directory>
# 로그 설정
ErrorLog logs/yourdomain_error.log
CustomLog logs/yourdomain_access.log combined
</VirtualHost>
Apache 설정 테스트 및 재시작:
# 설정 문법 확인
sudo httpd -t
# Apache 재시작
sudo systemctl restart httpd
# 상태 확인
sudo systemctl status httpd
3단계: SSL 인증서 발급
Certbot을 사용하여 Let's Encrypt 인증서 발급:
# 자동 설정 모드로 인증서 발급
sudo certbot --apache -d yourdomain.com -d www.yourdomain.com
대화형 설정 진행:
이메일 주소 입력: admin@yourdomain.com
약관 동의: A (Agree)
뉴스레터 수신: N (선택사항)
HTTP 트래픽 처리 방법:
1: HTTP 접속 유지
2: HTTP를 HTTPS로 리다이렉트 (권장)
선택: 2
4단계: SSL 설정 확인
Certbot이 자동으로 생성한 SSL 설정 확인:
# SSL 가상 호스트 설정 확인
sudo cat /etc/httpd/conf.d/yourdomain.com-le-ssl.conf
# Apache 포트 443 리스닝 확인
sudo netstat -tlnp | grep :443
# SSL 모듈 로드 확인
sudo httpd -M | grep ssl
생성된 SSL 설정 예시:
<VirtualHost *:443>
ServerName yourdomain.com
ServerAlias www.yourdomain.com
DocumentRoot /var/www/html
# SSL 인증서 설정
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/yourdomain.com/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/yourdomain.com/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/yourdomain.com/chain.pem
# 프록시 설정 (기존과 동일)
ProxyPreserveHost On
ProxyPass /webapp/ http://WAS서버-Private-IP:8080/webapp/
ProxyPassReverse /webapp/ http://WAS서버-Private-IP:8080/webapp/
</VirtualHost>
5단계: 자동 갱신 설정
Let's Encrypt 인증서는 90일마다 갱신이 필요합니다:
# 갱신 테스트 (실제 갱신은 하지 않음)
sudo certbot renew --dry-run
# 자동 갱신을 위한 cron 작업 추가
sudo crontab -e
# 다음 라인 추가 (매일 새벽 2시에 갱신 확인)
0 2 * * * /usr/bin/certbot renew --quiet && /bin/systemctl reload httpd
자동 갱신 확인:
# cron 작업 목록 확인
sudo crontab -l
# certbot 갱신 로그 확인
sudo tail -f /var/log/letsencrypt/letsencrypt.log
방법 B: AWS Certificate Manager (참고용)
개념 설명
현재 단계에서는 사용할 수 없지만, Week3.5의 ALB 구축 시 활용할 예정입니다.
Certificate Manager 특징
- 리전별 관리: ALB용은 ap-northeast-2, CloudFront용은 us-east-1
- 자동 갱신: AWS에서 완전 자동으로 관리
- 비용: AWS 서비스와 연동 시 무료
- 제약사항: EC2 Apache에 직접 적용 불가
Week3.5에서 사용할 구조
사용자 → ALB (Certificate Manager SSL) → Apache (HTTP) → Tomcat
전환 계획
Week3.5 ALB 구축 완료 후:
- Certificate Manager에서 인증서 발급
- ALB에 SSL 적용
- Apache에서 SSL 설정 제거
- HTTP → HTTPS 리다이렉트를 ALB에서 처리
두 방법 비교
| 항목 | Let's Encrypt | Certificate Manager |
|---|---|---|
| 비용 | 무료 | 무료 (AWS 연동시) |
| 설치 위치 | EC2 Apache | ALB/CloudFront |
| 갱신 방식 | 자동 (cron) | 완전 자동 |
| 관리 복잡도 | 중간 | 낮음 |
| 서버 의존성 | 높음 | 없음 |
| 현재 사용가능 | 가능 | 불가 (ALB 필요) |
| 확장성 | 제한적 | 높음 |
HTTPS 동작 확인
웹사이트 접속 테스트
HTTPS 직접 접속:
https://yourdomain.com/webapp/
https://www.yourdomain.com/webapp/
HTTP 리다이렉트 테스트:
http://yourdomain.com/webapp/ → https로 자동 전환 확인
브라우저에서 SSL 인증서 확인
- 브라우저 주소창에서 자물쇠 아이콘 클릭
- 인증서 정보 확인:
- 발급자: Let's Encrypt Authority X3
- 유효기간: 90일
- 도메인: yourdomain.com, www.yourdomain.com
SSL 보안 강도 테스트
SSL Labs 테스트:
https://www.ssllabs.com/ssltest/
- 도메인 입력 후 테스트 실행
- A 등급 이상 획득 목표
문제 해결
SSL 인증서 발급 실패
일반적인 원인:
-
도메인 소유 확인 실패
- DNS가 정확히 Web 서버를 가리키는지 확인
- 포트 80이 열려있는지 확인
-
방화벽 문제
# 보안 그룹에서 포트 80, 443 확인 # Apache가 포트 80에서 리스닝하는지 확인 sudo netstat -tlnp | grep :80 -
기존 SSL 설정 충돌
# 기존 SSL 설정 파일 확인 sudo ls -la /etc/httpd/conf.d/*ssl* # 충돌하는 설정 파일 백업 후 제거 sudo mv /etc/httpd/conf.d/ssl.conf /etc/httpd/conf.d/ssl.conf.backup
HTTPS 접속 불가
점검 순서:
-
Apache SSL 모듈 확인
sudo httpd -M | grep ssl # 결과: ssl_module (shared) 표시되어야 함 -
포트 443 리스닝 확인
sudo netstat -tlnp | grep :443 -
보안 그룹 설정
- EC2 콘솔에서 HTTPS 포트 443 확인
- 인바운드 규칙에 0.0.0.0/0 허용 확인
-
인증서 파일 권한 확인
sudo ls -la /etc/letsencrypt/live/yourdomain.com/
완료 체크리스트
Let's Encrypt 설정 완료
HTTPS 동작 확인
보안 검증
중요 사항
인증서 관리
- Let's Encrypt 인증서는 90일 유효기간
- 자동 갱신이 정상 동작하는지 주기적 확인 필요
- 갱신 실패 시 이메일 알림 확인
Week3.5 전환 준비
- 현재 설정은 임시적 성격
- ALB 구축 후 Certificate Manager로 전환 예정
- Apache SSL 설정 제거 및 HTTP 전용으로 변경
백업 및 복구
- 기존 Apache 설정 파일 백업 보관
- DNS 롤백 방법 숙지
- 문제 발생 시 HTTP 접속으로 복구 가능
SSL 인증서 적용 완료
Let's Encrypt를 통해 HTTPS 보안이 성공적으로 적용되었습니다. 이제 프로덕션급 보안을 갖춘 웹 서비스를 도메인으로 제공할 수 있습니다.
다음 단계: AWS EDU/Archive/조선대학교 AWS 멘토링/Week3.5-HA-Scalable-WebService/00-도메인연결및SSL적용(선택)/04-HTTPS동작확인에서 전체 시스템의 동작을 검증하고 Week3.5 고가용성 구축을 준비합니다.
관련 문서: AWS EDU/Archive/조선대학교 AWS 멘토링/Week3.5-HA-Scalable-WebService/00-도메인연결및SSL적용(선택)/02-도메인DNS변경, AWS EDU/Archive/조선대학교 AWS 멘토링/Week3.5-HA-Scalable-WebService/00-도메인연결및SSL적용(선택)/04-HTTPS동작확인